package com.xuanwu.jdk.demo;

import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 定义主业务增强逻辑类OrderServiceInvocationHandler，该类需实现接口InvocationHandler。
 * 在该类中定义一个Object类型的成员变量，还要定义一个带参的构造器，这个参数为Object对象。目的是，将目标对象引入该类，以便通过反射调用目标方法。
 * 当然，也可以将这个属性定义为IAccount接口类型，但，最好不要这样做，最好将其定义为Object。
 * 因为，这样这个主业务增强逻辑可以适用于本项目中的任何类型的目标类，而不仅仅拘泥于某一个类
 *
 */
@Slf4j
public class OrderServiceInvocationHandler  implements InvocationHandler {
    // 目标对象
    private Object target;

    public OrderServiceInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy 代表生成的代理对象
     * @param method 代表目标方法
     * @param args 代表目标方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //----此处是对目标类的增强
        log.info(">>>订单支付前信息校验<<<");

        //无论主业务方法有无参数，有无返回值，这种写法都可以兼顾到
        Object obj = method.invoke(target, args);

        log.info(">>>订单支付后消息推送<<<");

        return obj;
    }
}
